﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

#include<iostream>
using namespace std;

//引用：类型& 引⽤别名=引⽤对象;
//引用对象和引用别名指向同一片空间
/*引⽤在定义时必须初始化；⼀个变量可以有多个引⽤；引⽤⼀旦引⽤⼀个实体，再不能引⽤其他实体*/


//int main()
//{
//	int a = 5;
//	int& b = a; //给引用对象a取引用别名为b
//	int& c = b; //给引用对象b取引用别名为c
//
//	//观察a,b,c的地址
//	cout << &a << endl;
//	cout << &b << endl;
//	cout << &c << endl;
//
//	cout << a << " " << b << " " << c << endl;
//
//	a++;
//	cout << a << " " << b << " " << c << endl;
//	return 0;
//}



//int main()
//{
//	int a = 5;
//	int& ra = a;
//
//	int c = 10;
//	// 这⾥并非让ra引⽤c，因为C++引⽤不能改变指向
//	// 这⾥是⼀个赋值
//	ra = c;
//	cout << a << " " << ra << " " << c << endl;
//	return 0;
//}


//引用的使用
//引用作参数
//void Swap(int& x, int& y)
//{
//	int tmp = x;
//	x = y;
//	y = tmp;
//}

//int main()
//{
//	int a = 2, b = 5;
//	cout << a << " " << b << endl;
//
//	Swap(a, b);
//	cout << a << " " << b << endl;
//	return 0;
//}

//引用作返回值

//int& getMax(int& a, int& b)
//{
//    return (a > b) ? a : b;  // 返回较大值的引用
//}
//
//int main()
//{
//    int x = 10, y = 20;
//    getMax(x, y) = 30;      // 直接修改返回的引用（等价于 y = 30）
//    cout << y;              // 输出 30
//    return 0;
//}



//// 错误示例：返回局部变量的引用
//int& getLocalRef() 
//{
//    int local = 100;  // 局部变量，函数结束后会被销毁
//    return local;     // 返回局部变量的引用（危险！）
//}
//
//int main() 
//{
//    int& ref = getLocalRef();  // ref 成为悬空引用
//
//    // 第一次访问可能看似"正常"（实际是访问已释放的内存）
//    cout << "第一次访问: " << ref << endl;
//
//    // 执行其他操作可能覆盖原内存区域
//    int x = 200;
//    cout << "定义新变量后再次访问: " << ref << endl;
//
//    return 0;
//}

//const 引用

int main()
{
	// 绑定字面量（临时对象）
	const int& ref1 = 100;  // 合法：const 引用可绑定临时值

	// 绑定表达式结果（临时对象）
	int a = 10, b = 20;
	const int& ref2 = a + b;  // 合法：表达式结果是临时值

	// 绑定表达式结果（临时对象）
	const int& ref3 = 3 * a;   // 合法：表达式结果是临时值

	// 绑定不同类型（隐式转换后）
	double d = 3.14;
	const int& ref4 = d;  // 合法：d 被隐式转换为 int 临时值，再绑定到 ref4
	return 0;
}


//内联函数
// 声明内联函数
inline int Add(int a, int b)
{
	return a + b;
}

int main()
{
	int result = Add(3, 5);  // 编译器可能直接替换为 3 + 5
	return 0;
}

//宏
#define MULTIPLY(a, b) a * b

int main()
{
	int result = MULTIPLY(2 + 3, 4);  // 实际被替换为 2 + 3 * 4 = 14（而非预期的 5*4=20）
	return 0;
}